1
PyTorch 소개: 텐서가 중요한 이유
EvoClass-AI002강의 1
00:00

PyTorch 소개: 텐서가 중요한 이유

PyTorch는 딥러닝 연구 및 빠른 프로토타이핑에 적합한 매우 유연하고 동적인 오픈소스 프레임워크입니다. 핵심은 텐서이며, 딥러닝 모델에 필요한 수치 연산을 효율적으로 처리할 수 있도록 설계된 다차원 배열입니다. 이는 자동으로 GPU 가속를 지원합니다.

1. 텐서 구조 이해하기

PyTorch의 모든 입력, 출력 및 모델 파라미터는 텐서 안에 포함됩니다. 이들은 넘파이 배열과 같은 목적을 수행하지만, 특히 GPU과 같은 특수 하드웨어에서 처리되도록 최적화되어 있어 신경망에 필요한 대규모 선형 대수 연산에 훨씬 더 효율적입니다.

텐서를 정의하는 주요 속성:

  • 형태(Shape): 데이터의 차원을 정의하며, 튜플 형식으로 표현됩니다 (예: 이미지 배치의 경우 $4 \times 32 \times 32$).
  • 데이터 타입(Dtype): 저장된 요소의 숫자 타입을 지정합니다 (예: 모델 가중치의 경우 torch.float32 또는 인덱싱의 경우 torch.int64 사용).
  • 장치(디바이스): 물리적 하드웨어 위치를 나타냅니다. 일반적으로 'cpu' 또는 'cuda' (NVIDIA GPU)입니다.
동적 그래프와 자동 미분 (Autograd)
PyTorch는 명령형 실행 모델을 사용하여 연산이 실행될 때 계산 그래프가 생성됩니다. 이를 통해 내장된 자동 미분 엔진인 Autograd가 텐서의 모든 연산을 추적할 수 있게 해줍니다. 단, 속성 requires_grad=True이 설정되어야 합니다. 이를 통해 역전파 중 기울기 계산이 간편해집니다.
fundamentals.py
터미널bash — pytorch-env
> 준비되었습니다. 실행하려면 "실행"을 클릭하세요.
>
텐서 감시기실시간

코드를 실행하여 활성 텐서를 확인하세요.
질문 1
0과 1 사이의 균일 분포를 따르는 난수를 포함하는 $5 \times 5$ 텐서를 생성하는 명령어는 무엇입니까?
torch.rand(5, 5)
torch.random(5, 5)
torch.uniform(5, 5)
torch.randn(5, 5)
질문 2
텐서 $A$가 CPU에 있고, 텐서 $B$가 CUDA 장치에 있다면, $A + B$를 계산하려 할 때 어떤 일이 발생합니까?
같은 장치에 있는 텐서가 필요하기 때문에 오류가 발생합니다.
PyTorch는 자동으로 $A$를 CUDA 장치로 이동시키고 진행합니다.
연산은 CPU에서 수행되며 결과는 CPU로 반환됩니다.
질문 3
딥러닝에서 모델 가중치와 중간 계산에 가장 흔히 사용되는 데이터 타입(Dtype)은 무엇입니까?
torch.float32 (단일 정밀도 부동소수점)
torch.int64 (긴 정수)
torch.bool
torch.float64 (이중 정밀도 부동소수점)
도전 과제: 텐서 조작과 형태
특정 행렬 연산을 위한 텐서를 준비하세요.
크기가 $(10,)$인 특징 벡터 $F$가 있습니다. 이를 크기가 $(10, 5)$인 가중치 행렬 $W$로 곱해야 합니다. 행렬 곱셈(MatMul)이 성공하려면 $F$는 2차원이어야 합니다.
단계 1
$W$와의 곱셈 전에 $F$의 형태는 어떻게 되어야 하나요?
해답:
내부 차원이 맞아야 하므로 $F$는 $(1, 10)$이어야 합니다. 그러면 $(1, 10) @ (10, 5) \rightarrow (1, 5)$가 됩니다.
코드: F_new = F.unsqueeze(0) 또는 F_new = F.view(1, -1)
단계 2
$F_{new}$와 $W$ (형태 $(10, 5)$) 사이의 행렬 곱셈을 수행하세요.
해답:
연산은 직관적인 행렬 곱셈입니다.
코드: output = F_new @ W 또는 output = torch.matmul(F_new, W)
단계 3
어떤 방법이 지정된 차원을 갖는 텐서를 명시적으로 반환하여 텐서를 다시 $(50,)$로 평탄화할 수 있습니까? (처음에 $F$는 $(5, 10)$였다고 가정하고, 지금은 평탄화되었습니다.)
해답:
다음 방법을 사용하세요: view 또는 reshape 메서드입니다. 평탄화하는 가장 빠른 방법은 종종 -1을 한 차원에 사용하는 것입니다.
코드: F_flat = F.view(-1) 또는 F_flat = F.reshape(50)